/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package itm.dao.lineaInvestigacion;

//~--- non-JDK imports --------------------------------------------------------
import itm.exception.DAOException;
import itm.vo.file.ArchivoVO;
import itm.vo.grupoInvestigacion.GrupoInvestigacionVO;
import itm.vo.grupoInvestigacion.PaisVO;
import itm.vo.grupoInvestigacion.TipoEventoVO;
import itm.vo.lineaInvestigacion.EstadoComplementoLineaInvVO;
import itm.vo.lineaInvestigacion.LineaInvestigacionTO;
import itm.vo.lineaInvestigacion.LineaInvestigacionVO;
import itm.vo.lineaInvestigacion.ParAcademicoVO;

//~--- JDK imports ------------------------------------------------------------

import itm.vo.personas.PersonaVO;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrador
 */
public class LineaInvestigacionDAO {

    private CallableStatement callStmt = null;
    private ResultSet res = null;
    private String sql = "";
    Connection dbConexion;

    public LineaInvestigacionDAO(Connection dbConexion) {
        this.dbConexion = dbConexion;
    }

    public List<LineaInvestigacionVO> consultarLineaInv(LineaInvestigacionVO lineaInvVO) throws Exception {
        List<LineaInvestigacionVO> listaLinea = new ArrayList<LineaInvestigacionVO>();

        try {
            sql = "{call ITM_CONSULTAR_LINEA_INV(?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setString(1, lineaInvVO.getIdBusqueda());
            callStmt.setString(2, lineaInvVO.getNombreLinea());
            res = callStmt.executeQuery();

            while (res.next()) {
                lineaInvVO = new LineaInvestigacionVO();
                lineaInvVO.setIdLinea(res.getInt(1));
                lineaInvVO.setNombreLinea(res.getString(2));
                lineaInvVO.setFechaRegistro(res.getDate(3));
                listaLinea.add(lineaInvVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaLinea;
    }

    public LineaInvestigacionTO consultarLineaPK(LineaInvestigacionVO lineaInvVO) throws Exception {
        LineaInvestigacionTO lineaInvTO = new LineaInvestigacionTO();
        LineaInvestigacionVO lineaInvestigacionVO = new LineaInvestigacionVO();
        GrupoInvestigacionVO grupoInvestigacionVO = new GrupoInvestigacionVO();
        List<GrupoInvestigacionVO> listagrupo = new ArrayList<GrupoInvestigacionVO>();

        try {
            sql = "{call ITM_CONSULTAR_LINEA_INV_PK(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            res = callStmt.executeQuery();

            if (res.next()) {
                lineaInvestigacionVO = new LineaInvestigacionVO();
                lineaInvestigacionVO.setIdLinea(res.getInt(1));
                lineaInvestigacionVO.setNombreLinea(res.getString(2));
                lineaInvestigacionVO.setJustificacionLinea(res.getString(3));
                lineaInvestigacionVO.setPosibilidadesProyeccion(res.getString(4));
                lineaInvestigacionVO.setPersEpistemologica(res.getString(5));
                lineaInvestigacionVO.setFechaRegistro(res.getDate(6));
            }

            lineaInvTO.setLineaInvestigacionVO(lineaInvestigacionVO);
            callStmt.clearParameters();
            callStmt.clearBatch();
            callStmt.close();
            sql = "{call ITM_CONSULTAR_GRUPO_LINEA_INV(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            res = callStmt.executeQuery();

            while (res.next()) {
                grupoInvestigacionVO = new GrupoInvestigacionVO();
                grupoInvestigacionVO.setNombreGrupo(res.getString(2));
                listagrupo.add(grupoInvestigacionVO);
            }

            lineaInvTO.setGrupoInvestigacionVO(listagrupo);
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return lineaInvTO;
    }

    public List<ParAcademicoVO> consultarPares(LineaInvestigacionVO lineaInvVO) {
        List<ParAcademicoVO> listaPares = new ArrayList<ParAcademicoVO>();
        ParAcademicoVO parAcademicoVO;

        try {
            sql = "{call ITM_CONSULTAR_PARES(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            res = callStmt.executeQuery();

            while (res.next()) {
                parAcademicoVO = new ParAcademicoVO();
                parAcademicoVO.setIdParAcademico(res.getInt(1));
                parAcademicoVO.setNombreParAcademico(res.getString(2));
                listaPares.add(parAcademicoVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaPares;
    }

    public int guardarArchivoLinea(ArchivoVO archivoVO) {
        int resultado = 0;

        try {
            sql = "{call ITM_GUARDAR_ANEXO_LINEA(?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.BIGINT);
            callStmt.setInt(2, archivoVO.getIdModulo());
            callStmt.setString(3, archivoVO.getNombreArchivo());
            callStmt.setString(4, archivoVO.getDescripcion());
            callStmt.setString(5, archivoVO.getRutaArchivo());
            callStmt.setDate(6, archivoVO.getFechaArchivo());
            callStmt.execute();
            resultado = callStmt.getInt(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public int guardarFormularLinea(LineaInvestigacionVO lineaInvVO, EstadoComplementoLineaInvVO estCompLineaVO)
            throws Exception {
        int resultado = 0;

        try {
            sql = "{call ITM_FORMULAR_LINEA_INV(?,?,?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.BIGINT);
            callStmt.setString(2, lineaInvVO.getNombreLinea());
            callStmt.setString(3, lineaInvVO.getJustificacionLinea());
            callStmt.setString(4, lineaInvVO.getPosibilidadesProyeccion());
            callStmt.setString(5, lineaInvVO.getPersEpistemologica());
            callStmt.setDate(6, lineaInvVO.getFechaRegistro());
            callStmt.setInt(7, estCompLineaVO.getIdEstado());
            callStmt.execute();
            resultado = callStmt.getInt(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public String eliminarParesAcademicos(LineaInvestigacionVO lineaInvVO, ParAcademicoVO parAcademicoVO) {
        String resultado = "";

        try {
            sql = "{call ITM_ELIMINAR_PARES_LINEA(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, lineaInvVO.getIdLinea());
            callStmt.setInt(3, parAcademicoVO.getIdParAcademico());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public String insertarGruposLinea(LineaInvestigacionVO lineaInvVO, GrupoInvestigacionVO grupoInvVO) {
        String resultado = "";

        try {
            sql = "{call ITM_INSERTAR_GRUPO_LINEA(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, lineaInvVO.getIdLinea());
            callStmt.setInt(3, grupoInvVO.getIdGrupo());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
        }

        return resultado;
    }

    public void insertarParesAcademicos(ParAcademicoVO parAcademicoVO, LineaInvestigacionVO lineaInvVO)throws DAOException {
        try {
            sql = "{call ITM_AGREGAR_PARES_LINEA(?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            callStmt.setString(2, parAcademicoVO.getNombreParAcademico());
            callStmt.setInt(3, parAcademicoVO.getIdParAcademico());
            callStmt.setString(4, parAcademicoVO.getAreaTrabajoPar());
            callStmt.execute();
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(LineaInvestigacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new DAOException("Error al ingresar pares en la base de datos", ex);
        }
       

       
    }

    public List<LineaInvestigacionVO> listarLineas() throws Exception {
        List<LineaInvestigacionVO> listaLinea = new ArrayList<LineaInvestigacionVO>();
        LineaInvestigacionVO lineaInvVO;

        try {
            sql = "{call ITM_LISTA_LINEA_INV()}";
            callStmt = dbConexion.prepareCall(sql);
            res = callStmt.executeQuery();

            while (res.next()) {
                lineaInvVO = new LineaInvestigacionVO();
                lineaInvVO.setIdLinea(res.getInt(1));
                lineaInvVO.setNombreLinea(res.getString(2));
                listaLinea.add(lineaInvVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaLinea;
    }

    public List<PaisVO> listarPaises() throws Exception {
        List<PaisVO> listaPais = new ArrayList<PaisVO>();
        PaisVO paisVO;

        try {
            sql = "{call ITM_LISTA_PAISES()}";
            callStmt = dbConexion.prepareCall(sql);
            res = callStmt.executeQuery();

            while (res.next()) {
                paisVO = new PaisVO();
                paisVO.setIdPais(res.getInt(1));
                paisVO.setPais(res.getString(2));
                listaPais.add(paisVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaPais;
    }

    public List<ParAcademicoVO> listarPersonaParAcademico() {
        List<ParAcademicoVO> listaPares = new ArrayList<ParAcademicoVO>();
        ParAcademicoVO parAcademicoVO;

        try {
            sql = "{call ITM_LISTAR_PARES_ACADEMICOS()}";
            callStmt = dbConexion.prepareCall(sql);
            res = callStmt.executeQuery();

            while (res.next()) {
                parAcademicoVO = new ParAcademicoVO();
                parAcademicoVO.setIdParAcademico(res.getInt(1));
                parAcademicoVO.setNombreParAcademico(res.getString(2));
                listaPares.add(parAcademicoVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaPares;
    }

    public List<ParAcademicoVO> listarPersonasActivacionLinea(LineaInvestigacionVO lineaInvestigacionVO)
            throws Exception {
        List<ParAcademicoVO> listaPares = new ArrayList<ParAcademicoVO>();
        ParAcademicoVO parAcademicoVO;

        try {
            sql = "{call PRC_ITM_CARGAR_PARES_LINEA(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvestigacionVO.getIdLinea());
            res = callStmt.executeQuery();

            while (res.next()) {
                parAcademicoVO = new ParAcademicoVO();
                parAcademicoVO.setIdParAcademico(res.getInt(1));
                parAcademicoVO.setNombreParAcademico(res.getString(2));
                listaPares.add(parAcademicoVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaPares;
    }

    public List<TipoEventoVO> listarTipoEventos() throws Exception {
        List<TipoEventoVO> listaTipoevento = new ArrayList<TipoEventoVO>();
        TipoEventoVO tipoEventoVO;

        try {
            sql = "{call ITM_LISTA_EVENTOS()}";
            callStmt = dbConexion.prepareCall(sql);
            res = callStmt.executeQuery();

            while (res.next()) {
                tipoEventoVO = new TipoEventoVO();
                tipoEventoVO.setIdTipoEvento(res.getInt(1));
                tipoEventoVO.setTipodevento(res.getString(2));
                listaTipoevento.add(tipoEventoVO);
            }
        } catch (Exception ce) {
            ce.getStackTrace();
        }

        return listaTipoevento;
    }

    public String modificarLinea(LineaInvestigacionVO lineaInvVO) {
        String resultado = "";

        try {
            sql = "{call ITM_ACTUALIZAR_LINEA_INV(?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, lineaInvVO.getIdLinea());
            callStmt.setString(3, lineaInvVO.getJustificacionLinea());
            callStmt.setString(4, lineaInvVO.getPosibilidadesProyeccion());
            callStmt.setString(5, lineaInvVO.getPersEpistemologica());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public void ingresarObservaciones(EstadoComplementoLineaInvVO complementoLineaInvVO) throws DAOException {
        sql = "{call PRC_ITM_INGRESAR_OBSERVACIONES_LINEA(?,?,?)}";
        try {
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setLong(1, complementoLineaInvVO.getIdLinea());
            callStmt.setString(2, complementoLineaInvVO.getComentarios());
            callStmt.setDate(3, complementoLineaInvVO.getFechaComentarios());
            callStmt.executeUpdate();
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(LineaInvestigacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new DAOException("Error al ingresar comentarios en la base de datos", ex);
        }
    }

    public String aprobarLineaInv(EstadoComplementoLineaInvVO estCompLineaVO) throws Exception {
        String resultado = "";

        try {
            sql = "{call ITM_APROBAR_LINEA_INV(?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, estCompLineaVO.getIdLinea());
            callStmt.setDate(3, estCompLineaVO.getFechaActivacion());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public String rechazarLineaInv(EstadoComplementoLineaInvVO estCompLineaVO) {
        String resultado = "";

        try {
            sql = "{call ITM_RECHAZAR_LINEA_INV(?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, estCompLineaVO.getIdLinea());
            callStmt.setString(3, estCompLineaVO.getMotivoRechazo());
            callStmt.setDate(4, estCompLineaVO.getFechaRechazo());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public String activarLineaInv(EstadoComplementoLineaInvVO estCompLineaVO) throws Exception {
        String resultado = "";

        try {
            sql = "{call ITM_ACTIVAR_LINEA_INV(?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, estCompLineaVO.getIdLinea());
            callStmt.setString(3, estCompLineaVO.getComentarios());
            callStmt.setInt(4, estCompLineaVO.getAutoriza());
            callStmt.setDate(5, estCompLineaVO.getFechaActivacion());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    /**
     * Elaborado por Jimmy Ramírez Duque, 29 de Septiembre de 2009
     * Obtiene las personas que se pueden asignar como pares academicos
     * @return Lista de Personas que se pueden asignar como pares academicos
     * @throws itm.exception.DAOException
     */
    public List<PersonaVO> obtenerParesAcademicos() throws DAOException {
        List<PersonaVO> listaPares = new ArrayList<PersonaVO>();
        sql = "{call PRC_ITM_OBTENER_PARES_ACADEMICOS()}";
        try {
            callStmt = dbConexion.prepareCall(sql);
            res = callStmt.executeQuery();
            while (res.next()) {
                PersonaVO pvo = new PersonaVO();
                pvo.setIdPersona(res.getString(1));
                pvo.setNombrePersona(res.getString(2));
                listaPares.add(pvo);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(LineaInvestigacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new DAOException("Error al consultar en la base de datos", ex);
        }

        return listaPares;
    }

    public String inactivarLineaInv(EstadoComplementoLineaInvVO estCompLineaVO) throws Exception {
        String resultado = "";

        try {
            sql = "{call ITM_INACTIVAR_LINEA_INV(?,?,?,?,?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            callStmt.setInt(2, estCompLineaVO.getIdLinea());
            callStmt.setString(3, estCompLineaVO.getComentarios());
            callStmt.setInt(4, estCompLineaVO.getAutoriza());
            callStmt.setDate(5, estCompLineaVO.getFechaActivacion());
            callStmt.execute();
            resultado = callStmt.getString(1);
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public String consultarEstadoLinea(LineaInvestigacionVO lineaInvVO) throws Exception {
        String resultado = "";

        try {
            sql = "{call ITM_CONSULTAR_ESTADO_LINEA_INV(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            res = callStmt.executeQuery();

            if (res.next()) {
                resultado = res.getString(1);
            }
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return resultado;
    }

    public ArchivoVO consultarArchivo(LineaInvestigacionVO lineaInvVO) throws Exception {
        ArchivoVO archivoVO = new ArchivoVO();

        try {
            sql = "{call ITM_CONSULTAR_ARCHIVO_LINEA(?)}";
            callStmt = dbConexion.prepareCall(sql);
            callStmt.setInt(1, lineaInvVO.getIdLinea());
            res = callStmt.executeQuery();

            if (res.next()) {
                archivoVO.setIdArchivoVO(res.getInt(1));
                archivoVO.setNombreArchivo(res.getString(3));
                archivoVO.setDescripcion(res.getString(4));
                archivoVO.setRutaArchivo(res.getString(5));
                archivoVO.setFechaArchivo(res.getDate(6));
            }
        } catch (Exception ce) {
            ce.printStackTrace();
            System.err.println(ce.toString());
        }

        return archivoVO;
    }
}
